"""
项目忠告  先完成 再完美

需求 :
https://shareae.com/after-effects-project
爬取目标网页每一页下的所有主题的图片和视频
要求:
1图片不能有水印
操作流程
需要从一级目录进去(发送请求) 在二级目录拿到三级目录的url
像三级目录发送请求 拿对应的无水印图片 和视频

2图片视频保存要以该主题的id作为文件名保存
"https://videohive.net/item/simple-and-modern-lower-thirds/36818331
流程 对三级目录的url进行字符串提取  拿到对应的 36818331      id=36818331    id.mp4  id.jpg

3图片视频保存到不同的文件夹
流程  新建视频和音频文件夹    保存的时候 指定文件夹路径

4可以自己指定页数爬取
考虑找翻页参数

    print(response2.content.decode())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xab in position 4345: invalid start byte
表示 是utf-8的编码  以及解码  但是源文件里面 依然有一些 不能通过utf-8解码的字符
所以需要用 response.text
"""
import requests
from lxml import etree
import re

# 定义不同功能的函数 进行操作 】
# 爬取一级目录的函数
def first_crawl(start_num,end_num):
    # 循环的页数
    for page in range(start_num,end_num+1):
    #     初始url
        first_url=f"https://shareae.com/after-effects-project/page/{page}"
    #     构建请求头
        headers={
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36",
            "cookie": "_ga=GA1.2.1292249770.1648125313; _gid=GA1.2.344227236.1648798945; PHPSESSID=mn51516h4lnigu1jjifaeov3m2; _gat=1",
        }
        response=requests.get(url=first_url,headers=headers)
        # 进行数据转换
        data=response.content.decode()
        html=etree.HTML(data)
    #     匹配五十个二级目录的url
        second_urls=html.xpath('//div[@id="dle-content"]/div/h2/a/@href')
        # print(second_urls,len(second_urls))
        second_crawl(second_urls,headers)
# # 爬取二级目录的函数
def second_crawl(second_urls,headers):
    # 循环五十个二级目录的url   先取一个url
    for second_url in second_urls[0:1]:
        # 向二级目录发送请求 获取三级目录的url
        response2=requests.get(url=second_url,headers=headers)
        # print(response2.content.decode())
        data=response2.text
        # 用正则对三级目录的url进行提取
        third_url=re.findall('"(https://videohive.net/item/.*?/\d*)"',data)[0]
        # print(third_url)
        third_crawl(third_url,headers)
# 发送三级目录url的方法
def third_crawl(third_url,headers):
#     保存视频图片用的id名
    media_id=third_url.split("/")[-1]
    print(media_id)
    # 向三级目录发送请求 拿视频的链接以及 图片的链接
    response3=requests.get(url=third_url,headers=headers)
    data3=response3.content.decode()

    print(data3)
#     图片链接
# 在找url的时候 找不到要缩小范围 找  看是是否有参数变化
    photo_url=re.findall('url="(.*?)" as="image"',data3)[0].replace("amp;","")
    print(photo_url)
#     视频链接
    video_url=re.findall('href="(https://previews.customer.envatousercontent.com/h264-video-previews/b8d82957-8831-4566-9eba-cffdbdc7ad60/\d*.mp4)"',data3)[0]
    print(video_url)
    sava_data(photo_url,video_url,headers,media_id)

# 在匹配图片url的时候 对文本进行 相关的反爬操作   对字符进行添加其他字符串  造成网页上的是实际返回的url不匹配
# 所以要进行清洗
# https://videohive.img.customer.envatousercontent.com/files/384625251/preview.png?auto=compress%2Cformat&fit=crop&crop=top&max-h=8000&max-w=590&s=d3d825f8d71e05bba825c41370df0a2d
# https://videohive.img.customer.envatousercontent.com/files/384625251/preview.png?auto=compress%2Cformat&fit=crop&crop=top&max-h=8000&max-w=590&s=d3d825f8d71e05bba825c41370df0a2d

# 保存文件
def sava_data(photo_url,video_url,headers,media_id):
#     向图片视频发送请求
    response4=requests.get(url=photo_url,headers=headers)
    # 直接保存文件
    with open(f"./图片/{media_id}.jpg","wb")as f:
        f.write(response4.content)
    print(f"{media_id}.jpg保存完成")
    response5=requests.get(url=video_url,headers=headers)
    with open(f"./视频/{media_id}.mp4","wb")as f2:
        f2.write(response5.content)
    print(f"{media_id}.mp4保存完成")

if __name__ == '__main__':
    # 4可以自己指定页数爬取    # 考虑找翻页参数
    # https://shareae.com/after-effects-project/page/4/
    # https://shareae.com/after-effects-project"
    # 起始页
    start_num=50
    # 结束页
    end_num=55
    first_crawl(start_num,end_num)

















